home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / security / log_tcp_6.0alpha.shar / fromhost.c < prev    next >
C/C++ Source or Header  |  1993-07-02  |  4KB  |  144 lines

  1.  /*
  2.   * fromhost() determines the type of connection (datagram, stream), the name
  3.   * and address of the host at the other end of standard input, and the
  4.   * remote user name (if RFC 931 lookups are enabled). A host name of "stdin"
  5.   * is returned if the program is run from a tty. The value "unknown" is
  6.   * returned as a placeholder for information that could not be looked up (an
  7.   * empty username means that lookup was not even attempted). All results are
  8.   * in static or allocated memory.
  9.   * 
  10.   * On systems that have TLI as the official network programming interface, the
  11.   * software attempts to determine the underlying transport protocol family.
  12.   * If that happens to be IP, it immedately falls back to familiar concepts
  13.   * and primitives: sockets, DNS, and so on. In all other cases the network
  14.   * address results will be in some sort of transport-independent form, and
  15.   * functionality will be limited (no remote username lookups, no net/mask
  16.   * address patterns).
  17.   * 
  18.   * The return status is (-1) if the remote host pretends to have someone elses
  19.   * host name, otherwise a zero status is returned.
  20.   * 
  21.   * Diagnostics are reported through syslog(3).
  22.   * 
  23.   * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
  24.   */
  25.  
  26. #ifndef lint
  27. static char sccsid[] = "@(#) fromhost.c 1.8 93/07/02 16:33:25";
  28. #endif
  29.  
  30. /* System libraries. */
  31.  
  32. #include <sys/types.h>
  33. #include <stdio.h>
  34. #include <syslog.h>
  35.  
  36. #ifdef TLI
  37. #include <sys/tiuser.h>
  38. #include <stropts.h>
  39. #endif
  40.  
  41. /* Local stuff. */
  42.  
  43. #include "log_tcp.h"
  44.  
  45. /* Initially, we know nothing about the origin of the connection. */
  46.  
  47. static struct from_host from_unknown = {
  48.     0,                    /* connected/unconnected */
  49.     FROM_UNKNOWN,            /* remote host name */
  50.     FROM_UNKNOWN,            /* remote host address */
  51.     "",                    /* remote user name */
  52. };
  53.  
  54. /* fromhost - find out what is at the other end of standard input */
  55.  
  56. int     fromhost(f)
  57. struct from_host *f;
  58. {
  59.  
  60.     /*
  61.      * Initialize all results to UNKNOWN.
  62.      */
  63.  
  64.     *f = from_unknown;
  65.  
  66. #ifndef TLI
  67.  
  68.     /*
  69.      * Assume that stdin is always a TCP/IP socket. If you get errors like
  70.      * "getpeername: No such file or directory", you may have to enable TLI
  71.      * support anyway.
  72.      */
  73.  
  74.     return (from_sock(f));
  75. #else
  76.  
  77.     /*
  78.      * Systems with streams support can have different programmatic
  79.      * interfaces to the same network protocol. On systems with streams
  80.      * support, standard input will not necessarily always be a stream.
  81.      * 
  82.      * Thus, we must first find out what programmatic interface to use: sockets
  83.      * or (transport-independent) TLI. On some systems, sockets are not part
  84.      * of the streams system, so if stdin is not a stream we assume sockets.
  85.      * 
  86.      * If the transport protocol underneath TLI is not IP, we will end up with
  87.      * some magic cookies for addresses, but that is still better than
  88.      * knowing nothing.
  89.      */
  90.  
  91.     if (!isastream(0))
  92.     return (from_sock(f));
  93.     if (ioctl(0, I_FIND, "timod") > 0)
  94.     return (from_tli(f));
  95.     if (ioctl(0, I_FIND, "sockmod") > 0)
  96.     return (from_sock(f));
  97.     syslog(LOG_ERR, "fromhost: cannot establish type of transport interface");
  98.     return (0);
  99. #endif
  100. }
  101.  
  102. #ifdef TEST
  103.  
  104. /* Code for stand-alone testing. */
  105.  
  106. main(argc, argv)
  107. int     argc;
  108. char  **argv;
  109. {
  110.     struct from_host from;
  111.  
  112. #ifdef LOG_MAIL
  113.     (void) openlog(argv[0], LOG_PID, FACILITY);
  114. #else
  115.     (void) openlog(argv[0], LOG_PID);
  116. #endif
  117.  
  118.     /*
  119.      * Turn on the "IP-underneath-TLI" detection heuristics.
  120.      */
  121. #ifdef TLI
  122.     if (ioctl(0, I_FIND, "timod") == 0)
  123.     ioctl(0, I_PUSH, "timod");
  124. #endif /* TLI */
  125.  
  126.     /*
  127.      * Force remote username lookups.
  128.      */
  129.     (void) fromhost(&from);
  130.     if (from.user[0] == 0 && from.sock_type == FROM_CONNECTED && from.sin)
  131.     from.user = rfc931_name(from.sin);
  132.  
  133.     /*
  134.      * Show some results.
  135.      */
  136.     printf("address:   %s\n", from.addr);
  137.     printf("hostname:  %s\n", from.name);
  138.     printf("username:  %s\n", from.user);
  139.     printf("hostsinfo: %s\n", hosts_info(&from));
  140.     return (0);
  141. }
  142.  
  143. #endif /* TEST */
  144.